package com.cmii.sjw.department.control.jsc.util;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;
import java.util.Map;
import java.util.function.Function;

@Slf4j
public class ApiDbHelper {

    /**
     * 通用 POST 请求 + JSON 解析
     *
     * @param token        认证 token
     * @param baseUrl      根路径
     * @param endpoint     接口路径
     * @param form         参数
     * @return JSON 结构体，异常会抛出
     */
    public static JSONObject postAndParse(String token, String baseUrl, String endpoint, Map<String, Object> form) {
        if (StrUtil.isBlank(token)) throw new RuntimeException("Token 为空");

        String url = baseUrl + endpoint;
        String response = HttpUtil.createPost(url)
                .header("Authorization", token)
                .form(form)
                .execute()
                .body();

        log.info("接口响应 [{}]: {}", endpoint, response);

        // 1. 空返回判断
        if (StrUtil.isBlank(response)) {
            log.error("接口 [{}] 返回为空", endpoint);
            return null;
        }

        // 2. HTML 错误页面判断
        if (response.trim().startsWith("<")) {
            log.error("接口 [{}] 返回非 JSON 格式（可能是 HTML 错误页）：\n{}", endpoint, response);
            return null;
        }

        // 3. JSON 解析并异常处理
        JSONObject result;
        try {
            result = JSON.parseObject(response);
        } catch (Exception e) {
            log.error("接口 [{}] 返回内容无法解析为 JSON，内容如下：\n{}", endpoint, response, e);
            return null;
        }

        // 4. 接口返回码检查
        String code = result.getString("code");
        if (!"0".equals(code) && !"200".equals(code)) {
            log.warn("接口 [{}] 返回错误，code={}, message={}", endpoint, code, result.getString("message"));
            return null;
        }

        return result;
    }
    /*public static JSONObject postAndParse(String token, String baseUrl, String endpoint, Map<String, Object> form) {
        if (StrUtil.isBlank(token)) throw new RuntimeException("Token 为空");

        String url = baseUrl + endpoint;
        String response = HttpUtil.createPost(url)
                .header("Authorization", token)
                .form(form)
                .execute()
                .body();

        log.info("接口响应 [{}]: {}", endpoint, response);
        JSONObject result = JSON.parseObject(response);
        String code = result.getString("code");
        if (!"0".equals(code) && !"200".equals(code)) {
            throw new RuntimeException("接口错误：" + result.getString("message"));
        }

        return result;
    }*/

    /**
     * 通用保存或更新（按条件去重）
     *
     * @param mapper     MyBatis-Plus Mapper
     * @param entity     要保存的对象
     * @param queryFunc  构造条件的函数
     */
    public static <T> void insertOrUpdate(BaseMapper<T> mapper, T entity, Function<LambdaQueryWrapper<T>, LambdaQueryWrapper<T>> queryFunc) {
        LambdaQueryWrapper<T> wrapper = queryFunc.apply(new LambdaQueryWrapper<>());
        T existing = mapper.selectOne(wrapper);
        if (existing != null) {
            BeanUtil.copyProperties(entity, existing, CopyOptions.create().ignoreNullValue());
            mapper.updateById(existing);
        } else {
            mapper.insert(entity);
        }
    }

    /**
     * 日期填充工具（可选）
     */
    public static void fillTimestamps(Object obj) {
        try {
            BeanUtil.setProperty(obj, "createTime", new Date());
            BeanUtil.setProperty(obj, "updateTime", new Date());
            BeanUtil.setProperty(obj, "isDeleted", false);
        } catch (Exception ignored) {}
    }
}
